/*	Date:2017/7/29
 *	Author: Chunsheng Chen
 *	功能： 提供符号的创建、查找、删除、以及绑定对应的value值
 */

#ifndef _C_SYMBOL_H_
#define _C_SYMBOL_H_

#define TABLESIZE 107

#include"table.h"

//在flex中定义的保存行号的全局变量
extern int yylineno;

/*
函数名：yyerror
功能：打印错误信息到输出台
参数：  @1 错误消息
		... 参数
*/
void yyerror(char* s, ...); /*	report error msg	*/

/*
结构体名：symbol
功能：存储标识符的名字
*/
struct symbol{
	char* name;			/* 标识符的名字 */
	struct symbol* next;	/* 解决哈希冲突域	*/
};

struct symbol* hashtable[TABLESIZE]; /* symbol的哈希表 */

/*
函数名：symhash
功能：对字符串进行哈希求值
参数：  @1 字符串
返回值： unsigned 字符串对应的哈希值
*/
static unsigned symhash(char*);

/*
函数名：newSymbol
功能：创建一个新的符号
参数：  @1 字符串
		@2 指向符号的指针
返回值： 指向字符串对应的符号的指针
*/
struct symbol* newSymbol(char*, struct symbol*);

/*
函数名：insertSymbol
功能：插入一个新的符号
参数：  @1 字符串
返回值： 指向字符串对应的符号的指针
*/
struct symbol* insertSymbol(char*);

/*
函数名：lookupSymbol
功能：查找一个字符串对应的符号
参数：  @1 字符串
返回值： 若找到则返回指向字符串对应的符号的指针，找不到则返回NULL
*/
struct symbol* lookupSymbol(char*);

/*
函数名：popSymbol
功能：弹出一个字符串对应的符号
参数：  @1 字符串
*/
void popSymbol(char*);

/*
函数名：Symtable_lookup
功能：在给定的符号表中，根据符号值查找对应的value值
参数：  @1 key-value哈希表
		@2 符号
返回值： 若成功找到，则返回对应指向value值得指针，否则则返回NULL
*/
void* Symtable_lookup(struct table*, struct symbol*);

/*
函数名：Symtable_insert
功能：在给定的符号表中，插入符号+对应绑定的值
参数：  @1 key-value哈希表
		@2 符号
		@3 绑定的值
返回值： 若成功找到，则返回对应指向value值得指针，否则则返回NULL
*/
void Symtable_insert(struct table*, struct symbol*, void* );

/*
函数名：begin_Scope
功能：在给定的符号表中插入一个特殊的值，表示作用域的开始
参数：  @1 key-value哈希表
注意： 这个特殊的值使用的是 static struct symbol marksym = {"<mark>", NULL}; 
	static类型的，地址是独立于symbol 哈希表的。所以之后如果遇到 "<mark>"也不用担心，作用域错误。
*/
void begin_Scope(struct table*);

/*
函数名：end_Scope
功能：在给定的符号表中弹出item直到标记作用域的开始处
参数：  @1 key-value哈希表
*/
void end_Scope(struct table*);

#endif
